package com.tencreat.service.mall;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.tencreat.common.core.HttpResult;
import com.tencreat.common.core.domain.model.LoginUser;
import com.tencreat.common.core.domain.model.ReqIdParam;
import com.tencreat.common.core.domain.model.ReqIdsParam;
import com.tencreat.domain.mall.MallGoodsCut;
import com.tencreat.domain.mall.MallIntegralGoods;
import com.tencreat.domain.mall.MallOrder;
import com.tencreat.domain.mall.dto.*;
import com.tencreat.domain.mall.vo.*;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 砍价商品Service接口
 *
 * @author wangkai
 * @date 2021-11-04
 */
public interface IMallGoodsCutService extends IService<MallGoodsCut> {
    /**
     * 查询砍价商品
     *
     * @param id 砍价商品ID
     * @return 砍价商品
     */
    HttpResult<ResGoodsCutDetailVO> selectMallGoodsCutById(ReqIdParam id, LoginUser loginUser);

    /**
     * 查询砍价商品列表
     *
     * @param mallGoodsCut 砍价商品
     * @return 砍价商品集合
     */
    List<MallGoodsCut> selectMallGoodsCutList(MallGoodsCut mallGoodsCut);

    /**
     * 新增砍价商品
     *
     * @param mallGoodsCut 砍价商品
     * @param loginCheck
     * @return 结果
     */
    int insertMallGoodsCut(MallGoodsCut mallGoodsCut, LoginUser loginCheck);

    /**
     * 修改砍价商品
     *
     * @param mallGoodsCut 砍价商品
     * @return 结果
     */
    int updateMallGoodsCut(MallGoodsCut mallGoodsCut);

    /**
     * 批量删除砍价商品
     *
     * @param ids 需要删除的砍价商品ID
     * @return 结果
     */
    int deleteMallGoodsCutByIds(ReqIdsParam ids);

    /**
     * 删除砍价商品信息
     *
     * @param id 砍价商品ID
     * @return 结果
     */
    int deleteMallGoodsCutById(ReqIdParam id);

    /**
     * 砍价列表查询
     *
     * @param page
     * @param
     * @return
     */
    Page<ResMallGoodsCutsVO> page(IPage<ResMallGoodsCutsVO> page, MallGoodsCutDTO mallGoodsCutDTO);

    /**
     * 砍价商品提交订单
     *
     * @param orderVO
     * @param loginCheck
     * @return
     */
    HttpResult<ResOrderMallSubmitVO> submit(OrderMallSubmitDTO orderVO, LoginUser loginCheck);

    /**
     * 开始砍价
     * 新版已移转 bargain方法
     *
     * @param startVO
     * @return
     */
    @Deprecated
    ConcurrentHashMap<String, Object> start(MallGoodsCutStartDTO startVO);

    /**
     * 开始砍价
     *
     * @param dto 入参
     * @return 本次砍掉多少钱
     */
    BigDecimal bargain(MallGoodsCutBargainDTO dto);

    /**
     * 砍价订单付款或失效后处理
     *
     * @param order 订单
     */
    void closeAccount(MallOrder order);

    /**
     * 限时砍价个人信息
     *
     * @param cutId
     * @param loginCheck
     * @return
     */
    HttpResult<ResCutIngInfoVO> cutIngInfo(Long cutId, LoginUser loginCheck);

    /**
     * 根据订单号获取限时砍价个人信息
     *
     * @param orderSn 订单号
     * @return
     */
    HttpResult<ResCutIngInfoVO> cutIngInfo(String orderSn);

    /**
     * 我的砍价列表
     *
     * @param page
     * @param dto 入参对象
     * @return
     */
    Page<ResMyCutInfosVO> myCutList(Page<ResMallGoodsCutsVO> page,  MallCutListDTO dto);

    /**
     * 领取砍价金额
     *
     * @param vo
     * @return
     */
    @Deprecated
    HttpResult<?> cutAfterReward(CutAfterRewardDTO vo);

    /**
     * 领取砍价金额 新版
     *
     * @param unionId 用户unionId
     * @return
     */
    void cutAfterReward2(String unionId);

    /**
     * 砍价列表
     * @param iPage 分页参数
     * @param dto 入参
     * @return 结果
     */
    Page<MallGoodsCutVO> PCPage(IPage<?> iPage ,MallAdminGoodsCutDTO dto);

    HttpResult<Map<String, Object>> getDetail(Long cutId);

    HttpResult<IPage<Map<String, Object>>> cutRecord(Page<Map<String, Object>> page, CutRecordPCDTO vo);

    HttpResult<IPage<Map<String, Object>>> cutDetails(Page<Map<String, Object>> page, String cutSn);

    CutOrderInfoVO getCutOrderInfo(String orderSn);

    /**
     * 砍价管理金额统计
     * @return
     */
    MallGoodsCutStatisticsVO cutStatistics();

    boolean reSortOrderReduce(MallGoodsCut reqIdParam);

    boolean reSortOrderPlus(MallGoodsCut reqIdParam);
}
